// 在原有代码的AnalyzeAndSnapshot函数中，处理每个内存单元时添加填充逻辑
func (h *Helper) AnalyzeAndSnapshot() {
	h.traceeMapUnits = parseProcMapsFile(h.traceeProMem.GetProcMapsPath())
	h.dumpTraceeMapUnits()
	defer h.dumpTraceeMapUnits()
	h.tryToExclueTheMapUintsWhichContainInitialIP()

	// 定义512M的字节数（512 * 1024 * 1024）
	const targetSize512M = 536870912

	for _, u := range h.traceeMapUnits {
		Assert(u.Size > 0)
		checkOkFlag := true
		if glOnlyExecReMmap {
			checkOkFlag = false
			if u.IsExec() {
				checkOkFlag = true
			}
		}

		if checkOkFlag {
			Assert(false == u.IsContainAddr(h.traceeInitialIP))

			// --------------------------
			// 新增：处理内存段不足512M时的填充逻辑
			// --------------------------
			var originalStartAddr = u.StartAddr
			var originalLen = u.Size
			var totalLen = originalLen

			// 若当前内存段小于512M，计算需要填充的大小
			if originalLen < targetSize512M {
				padSize := targetSize512M - originalLen
				// 填充内存的起始地址 = 原内存段结束地址（确保连续性）
				padStartAddr := u.EndAddr

				// 确保填充起始地址按2MB对齐（与大页逻辑匹配）
				X := uint64(2 * 1024 * 1024) // 2MB对齐基准
				mod := padStartAddr % X
				if mod != 0 {
					// 地址不对齐时，向上调整到最近的2MB对齐地址
					adjust := X - mod
					padStartAddr += adjust
					padSize -= adjust // 调整填充大小，保证总长度仍为512M
					Assert(padSize >= 0, "填充大小调整后不能为负")
				}

				// 生成填充内存的mmap命令（继承原内存段权限）
				var padMmap CmdBodyUnit
				padMmap.op = "mmap"
				padMmap.addr = padStartAddr
				padMmap.len = padSize
				padMmap.prot = uint64(u.GetProt()) // 继承原权限（如r-x）
				padMmap.flags = uint64(syscall.MAP_FIXED | syscall.MAP_PRIVATE | syscall.MAP_ANON)
				h.addCmdBodyUnit(&padMmap)

				// 对填充的内存创建快照（可选，用于后续恢复）
				h.addSnapshotUnit(padStartAddr, padSize)

				// 更新总长度为512M（原长度+填充长度）
				totalLen = targetSize512M
				MyPrintf("内存段 %x 大小 %d 不足512M，已填充至512M，填充地址: %x, 填充大小: %d\n",
					originalStartAddr, originalLen, padStartAddr, padSize)
			}

			// 基于总长度（原长度或填充后的512M）进行大页拆分
			spans := selfAdaptMmapPagesFixedCalc(originalStartAddr, totalLen)
			Assert(len(spans) == 3 || len(spans) == 1)

			if len(spans) == 3 {
				Assert(spans[1].Len > 0)
				// 对整个内存段（含填充部分）创建快照
				h.addSnapshotUnit(originalStartAddr, totalLen)

				// 生成解除原映射的命令（包含填充部分）
				var cmdBodyU CmdBodyUnit
				cmdBodyU.op = "munmap"
				cmdBodyU.addr = originalStartAddr
				cmdBodyU.len = totalLen
				h.addCmdBodyUnit(&cmdBodyU)

				// 重新映射拆分后的各段（含填充部分的大页优化）
				for spanIdx, span := range spans {
					hugePageFlag := false
					if spanIdx == 1 {
						hugePageFlag = true
						Assert(span.Len > 0 && span.Len%(1024*1024*2) == 0 && span.StartAddr%(1024*1024*2) == 0)
					}
					if span.Len > 0 {
						var cmdBodyU CmdBodyUnit
						cmdBodyU.op = "mmap"
						cmdBodyU.addr = span.StartAddr
						cmdBodyU.len = span.Len
						cmdBodyU.prot = uint64(u.GetProt())
						flags := syscall.MAP_FIXED | syscall.MAP_PRIVATE | syscall.MAP_ANON
						cmdBodyU.flags = uint64(flags)
						h.addCmdBodyUnit(&cmdBodyU)

						if hugePageFlag {
							var madvCmd CmdBodyUnit
							madvCmd.op = "madvise"
							madvCmd.addr = span.StartAddr
							madvCmd.len = span.Len
							madvCmd.prot = MADV_HUGEPAGE
							madvCmd.flags = 0
							h.addCmdBodyUnit(&madvCmd)
						}
					}
				}
			}
		}
	}
}